library(ggplot2)
library(tidyverse)
library(DT)
library(plotly)
library(gridExtra)
library(knitr)
library(dplyr)
rm(list = ls())
deposits <- read.csv("deposits.csv", colClasses = c("Actor" = "character"))

states <- read.csv("states.csv")
states$Collateral <- as.numeric(states$Collateral) / 1e18


swaps <- read.csv("swaps.csv")
swaps$zeroForOne <- as.logical(swaps$zeroForOne)
swaps$In <- as.logical(swaps$In)
swaps$Amount <- ifelse(
  (swaps$zeroForOne & swaps$In) | (!swaps$zeroForOne & !swaps$In),
  as.numeric(swaps$Amount) / 1e6,
  as.numeric(swaps$Amount) / 1e18
)

swaps$delta0 = as.numeric(swaps$delta0) / 1e6
swaps$delta0c = as.numeric(swaps$delta0c) / 1e6

swaps$delta1 = as.numeric(swaps$delta1) / 1e18
swaps$delta1c = as.numeric(swaps$delta1c) / 1e18


#head(deposits)
dim(swaps)
[1] 10  8
dim(states)
[1] 13 13
# Select the first occurrence of each Block Number in states
states_first <- states %>%
  group_by(blockNumber) %>%
  slice(1) %>%
  ungroup()

merged_data <- left_join(swaps, states_first, by = "blockNumber")
q = 2**96
merged_data$price <- 1e12/(merged_data$SqrtPriceX96/q)**2
merged_data$priceC <- 1e12/(merged_data$SqrtPriceX96c/q)**2

Swap sqrtPrice with control comparison

if (nrow(merged_data) > 0) {
# Plot the price chart with both 'price' and 'priceC' lines
p_price <- ggplot(merged_data) +
  geom_line(aes(x = blockNumber, y = price), color = "green", size = 1) +
  geom_line(aes(x = blockNumber, y = priceC), color = "red", size = 1, linetype = "dashed") +  # Add 'priceC' line
  labs(title = "Price Chart", y = "Price") +
  theme_minimal()

# Create the trading volume bar chart
p_volume <- ggplot(merged_data, aes(x = blockNumber, y = delta1)) +
  geom_bar(stat = "identity", fill = "blue", alpha = 0.7) +
  labs(title = "Trading Volume (Amount)", y = "Amount") +
  theme_minimal()

# Convert ggplot objects to plotly objects
p_price_plotly <- ggplotly(p_price)
p_volume_plotly <- ggplotly(p_volume)

# Combine the two plots into one figure with specified heights and shared x-axis
combined_plot <- subplot(
  p_price_plotly, p_volume_plotly,
  nrows = 2,
  shareX = TRUE,
  heights = c(0.7, 0.3)  # 70% height for the price chart and 30% for the volume chart
) %>%
  layout(
    title = "Pool ALM",
    xaxis = list(
      title = "Block Number", 
      rangeslider = list(
        visible = TRUE, 
        thickness = 0.02  # Adjust thickness of the range slider to reduce height
      )
    ),
    yaxis = list(title = "Price"),  # Y-axis for the price chart
    yaxis2 = list(title = "Amount")  # Y-axis for the volume chart
  )

# Show the combined plot
combined_plot
}

Swap deltas with control comparison

if (nrow(swaps) > 0) {
# Create the delta0 and delta0c bar chart
p_delta0 <- ggplot(swaps) +
  geom_bar(aes(x = blockNumber, y = delta0), stat = "identity", fill = "green", alpha = 0.7) +
  geom_bar(aes(x = blockNumber, y = delta0c), stat = "identity", fill = "orange", alpha = 0.5) +
  labs(title = "Delta0 and Delta0c (Amount)", y = "Amount") +
  theme_minimal()

# Create the delta1 and delta1c bar chart
p_delta1 <- ggplot(swaps) +
  geom_bar(aes(x = blockNumber, y = delta1), stat = "identity", fill = "blue", alpha = 0.7) +
  geom_bar(aes(x = blockNumber, y = delta1c), stat = "identity", fill = "purple", alpha = 0.5) +
  labs(title = "Delta1 and Delta1c (Amount)", y = "Amount") +
  theme_minimal()

# Convert ggplot objects to plotly objects
p_delta0_plotly <- ggplotly(p_delta0)
p_delta1_plotly <- ggplotly(p_delta1)

# Combine the two bar plots into one figure with specified heights and shared x-axis
combined_plot <- subplot(
  p_delta0_plotly, p_delta1_plotly,
  nrows = 2,
  shareX = TRUE,
  heights = c(0.5, 0.5)  # Adjust heights if needed, here it's split equally
) %>%
  layout(
    title = "Delta0 and Delta1 Comparison with Delta0c and Delta1c",
    xaxis = list(
      title = "Block Number",
      rangeslider = list(
        visible = TRUE,
        thickness = 0.02
      )
    ),
    yaxis = list(title = "delta0"),  # Y-axis for Delta0 and Delta0c
    yaxis2 = list(title = "delta1")  # Y-axis for Delta1 and Delta1c
  )

# Show the combined plot
combined_plot
}
if (nrow(swaps) > 0) {
swaps <- swaps %>%
  mutate(
    abs_diff_delta0 = abs(delta0 - delta0c),
    abs_diff_delta1 = abs(delta1 - delta1c)
  )

p_abs_diff_delta0 <- ggplot(swaps) +
  geom_bar(aes(x = blockNumber, y = abs_diff_delta0), stat = "identity", fill = "green", alpha = 0.7) +
  labs(title = "abs diff d0", y = "AD") +
  theme_minimal()

p_abs_diff_delta1 <- ggplot(swaps) +
  geom_bar(aes(x = blockNumber, y = abs_diff_delta1), stat = "identity", fill = "blue", alpha = 0.7) +
  labs(title = "abs diff d1", y = "AD") +
  theme_minimal()

# Convert ggplot objects to plotly objects
p_abs_diff_delta0_plotly <- ggplotly(p_abs_diff_delta0)
p_abs_diff_delta1_plotly <- ggplotly(p_abs_diff_delta1)

# Combine the two bar plots into one figure with specified heights and shared x-axis
combined_plot <- subplot(
  p_abs_diff_delta0_plotly, p_abs_diff_delta1_plotly,
  nrows = 2,
  shareX = TRUE,
  heights = c(0.5, 0.5)
) %>%
  layout(
    title = "Absolute Differences for Delta0 and Delta1 vs control",
    xaxis = list(
      title = "Block Number",
      rangeslider = list(
        visible = TRUE,
        thickness = 0.02
      )
    ),
    yaxis = list(title = "abs diff d0"),
    yaxis2 = list(title = "abs diff d1")
  )

# Show the combined plot
combined_plot
}
states_1 <- states
states_1$sharePrice <- states_1$sharePrice/ 1e18
states_1$sharePriceControl <-  states_1$sharePriceControl/(1e18)

p_sharePrice <- ggplot(states_1) +
  geom_line(aes(x = blockNumber, y = sharePrice), color = "green", size = 1) +
  geom_line(aes(x = blockNumber, y = sharePriceControl), color = "red", size = 1, linetype = "dashed") +
  labs(title = "Share Price Chart", y = "Share Price") +
  theme_minimal()
p_sharePrice_plotly <- ggplotly(p_sharePrice)
combined_plot <- p_sharePrice_plotly %>%
  layout(
    title = "Pool ALM",
    xaxis = list(
      title = "Block Number", 
      rangeslider = list(
        visible = TRUE, 
        thickness = 0.02
      )
    ),
    yaxis = list(title = "Share Price")
  )
combined_plot
states_1 <- states
states_1$tvl <-  states_1$tvl/1e18
states_1$tvlControl <-  states_1$tvlControl/(1e18*2)

p_sharePrice <- ggplot(states_1) +
  geom_line(aes(x = blockNumber, y = tvl), color = "green", size = 1) +
  geom_line(aes(x = blockNumber, y = tvlControl), color = "red", size = 1, linetype = "dashed") +
  labs(title = "TVL Chart", y = "TVL") +
  theme_minimal()
p_sharePrice_plotly <- ggplotly(p_sharePrice)
combined_plot <- p_sharePrice_plotly %>%
  layout(
    title = "Pool ALM",
    xaxis = list(
      title = "Block Number", 
      rangeslider = list(
        visible = TRUE, 
        thickness = 0.02
      )
    ),
    yaxis = list(title = "TVL")
  )
combined_plot
deposits_m <- deposits[, c("tWETH", "tWETHc", "tUSDCc", "blockNumber", "Actor", "delShares", "delSharesControl")] %>% 
  arrange(blockNumber) %>%
  mutate(actor = paste0("Actor", as.integer(factor(Actor)))) %>%
  select(-Actor)

deposits_m$tWETH = as.numeric(deposits_m$tWETH) / 1e18
deposits_m$tWETHc = as.numeric(deposits_m$tWETHc) / 1e18
deposits_m$tUSDCc = as.numeric(deposits_m$tUSDCc) / 1e6

deposits_m$delShares = as.numeric(deposits_m$delShares) / 1e18
deposits_m$delSharesControl = as.numeric(deposits_m$delSharesControl) / 1e18

datatable(deposits_m, options = list(pageLength = 100), caption = "Deposits Table") %>%
  formatRound(columns = c("tWETH", "tWETHc"), digits = 2) %>% formatRound(columns = c("tUSDCc", "delShares", "delSharesControl"), digits = 0)
NA
LS0tCnRpdGxlOiAiSEggU2ltdWxhdGlvbiBjaGFydHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgpgYGB7ciB3YXJuaWducz1mYWxzZX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShEVCkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCmRlcG9zaXRzIDwtIHJlYWQuY3N2KCJkZXBvc2l0cy5jc3YiLCBjb2xDbGFzc2VzID0gYygiQWN0b3IiID0gImNoYXJhY3RlciIpKQoKc3RhdGVzIDwtIHJlYWQuY3N2KCJzdGF0ZXMuY3N2IikKc3RhdGVzJENvbGxhdGVyYWwgPC0gYXMubnVtZXJpYyhzdGF0ZXMkQ29sbGF0ZXJhbCkgLyAxZTE4CgoKc3dhcHMgPC0gcmVhZC5jc3YoInN3YXBzLmNzdiIpCnN3YXBzJHplcm9Gb3JPbmUgPC0gYXMubG9naWNhbChzd2FwcyR6ZXJvRm9yT25lKQpzd2FwcyRJbiA8LSBhcy5sb2dpY2FsKHN3YXBzJEluKQpzd2FwcyRBbW91bnQgPC0gaWZlbHNlKAogIChzd2FwcyR6ZXJvRm9yT25lICYgc3dhcHMkSW4pIHwgKCFzd2FwcyR6ZXJvRm9yT25lICYgIXN3YXBzJEluKSwKICBhcy5udW1lcmljKHN3YXBzJEFtb3VudCkgLyAxZTYsCiAgYXMubnVtZXJpYyhzd2FwcyRBbW91bnQpIC8gMWUxOAopCgpzd2FwcyRkZWx0YTAgPSBhcy5udW1lcmljKHN3YXBzJGRlbHRhMCkgLyAxZTYKc3dhcHMkZGVsdGEwYyA9IGFzLm51bWVyaWMoc3dhcHMkZGVsdGEwYykgLyAxZTYKCnN3YXBzJGRlbHRhMSA9IGFzLm51bWVyaWMoc3dhcHMkZGVsdGExKSAvIDFlMTgKc3dhcHMkZGVsdGExYyA9IGFzLm51bWVyaWMoc3dhcHMkZGVsdGExYykgLyAxZTE4CgoKI2hlYWQoZGVwb3NpdHMpCmRpbShzd2FwcykKZGltKHN0YXRlcykKYGBgCgpgYGB7cn0KIyBTZWxlY3QgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBCbG9jayBOdW1iZXIgaW4gc3RhdGVzCnN0YXRlc19maXJzdCA8LSBzdGF0ZXMgJT4lCiAgZ3JvdXBfYnkoYmxvY2tOdW1iZXIpICU+JQogIHNsaWNlKDEpICU+JQogIHVuZ3JvdXAoKQoKbWVyZ2VkX2RhdGEgPC0gbGVmdF9qb2luKHN3YXBzLCBzdGF0ZXNfZmlyc3QsIGJ5ID0gImJsb2NrTnVtYmVyIikKYGBgCgoKYGBge3J9CnEgPSAyKio5NgptZXJnZWRfZGF0YSRwcmljZSA8LSAxZTEyLyhtZXJnZWRfZGF0YSRTcXJ0UHJpY2VYOTYvcSkqKjIKbWVyZ2VkX2RhdGEkcHJpY2VDIDwtIDFlMTIvKG1lcmdlZF9kYXRhJFNxcnRQcmljZVg5NmMvcSkqKjIKYGBgCgoKIyMgU3dhcCBzcXJ0UHJpY2Ugd2l0aCBjb250cm9sIGNvbXBhcmlzb24KYGBge3J9CmlmIChucm93KG1lcmdlZF9kYXRhKSA+IDApIHsKIyBQbG90IHRoZSBwcmljZSBjaGFydCB3aXRoIGJvdGggJ3ByaWNlJyBhbmQgJ3ByaWNlQycgbGluZXMKcF9wcmljZSA8LSBnZ3Bsb3QobWVyZ2VkX2RhdGEpICsKICBnZW9tX2xpbmUoYWVzKHggPSBibG9ja051bWJlciwgeSA9IHByaWNlKSwgY29sb3IgPSAiZ3JlZW4iLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeCA9IGJsb2NrTnVtYmVyLCB5ID0gcHJpY2VDKSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgICMgQWRkICdwcmljZUMnIGxpbmUKICBsYWJzKHRpdGxlID0gIlByaWNlIENoYXJ0IiwgeSA9ICJQcmljZSIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgQ3JlYXRlIHRoZSB0cmFkaW5nIHZvbHVtZSBiYXIgY2hhcnQKcF92b2x1bWUgPC0gZ2dwbG90KG1lcmdlZF9kYXRhLCBhZXMoeCA9IGJsb2NrTnVtYmVyLCB5ID0gZGVsdGExKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNykgKwogIGxhYnModGl0bGUgPSAiVHJhZGluZyBWb2x1bWUgKEFtb3VudCkiLCB5ID0gIkFtb3VudCIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgQ29udmVydCBnZ3Bsb3Qgb2JqZWN0cyB0byBwbG90bHkgb2JqZWN0cwpwX3ByaWNlX3Bsb3RseSA8LSBnZ3Bsb3RseShwX3ByaWNlKQpwX3ZvbHVtZV9wbG90bHkgPC0gZ2dwbG90bHkocF92b2x1bWUpCgojIENvbWJpbmUgdGhlIHR3byBwbG90cyBpbnRvIG9uZSBmaWd1cmUgd2l0aCBzcGVjaWZpZWQgaGVpZ2h0cyBhbmQgc2hhcmVkIHgtYXhpcwpjb21iaW5lZF9wbG90IDwtIHN1YnBsb3QoCiAgcF9wcmljZV9wbG90bHksIHBfdm9sdW1lX3Bsb3RseSwKICBucm93cyA9IDIsCiAgc2hhcmVYID0gVFJVRSwKICBoZWlnaHRzID0gYygwLjcsIDAuMykgICMgNzAlIGhlaWdodCBmb3IgdGhlIHByaWNlIGNoYXJ0IGFuZCAzMCUgZm9yIHRoZSB2b2x1bWUgY2hhcnQKKSAlPiUKICBsYXlvdXQoCiAgICB0aXRsZSA9ICJQb29sIEFMTSIsCiAgICB4YXhpcyA9IGxpc3QoCiAgICAgIHRpdGxlID0gIkJsb2NrIE51bWJlciIsIAogICAgICByYW5nZXNsaWRlciA9IGxpc3QoCiAgICAgICAgdmlzaWJsZSA9IFRSVUUsIAogICAgICAgIHRoaWNrbmVzcyA9IDAuMDIgICMgQWRqdXN0IHRoaWNrbmVzcyBvZiB0aGUgcmFuZ2Ugc2xpZGVyIHRvIHJlZHVjZSBoZWlnaHQKICAgICAgKQogICAgKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQcmljZSIpLCAgIyBZLWF4aXMgZm9yIHRoZSBwcmljZSBjaGFydAogICAgeWF4aXMyID0gbGlzdCh0aXRsZSA9ICJBbW91bnQiKSAgIyBZLWF4aXMgZm9yIHRoZSB2b2x1bWUgY2hhcnQKICApCgojIFNob3cgdGhlIGNvbWJpbmVkIHBsb3QKY29tYmluZWRfcGxvdAp9CmBgYAoKCiMjIFN3YXAgZGVsdGFzIHdpdGggY29udHJvbCBjb21wYXJpc29uCmBgYHtyfQppZiAobnJvdyhzd2FwcykgPiAwKSB7CiMgQ3JlYXRlIHRoZSBkZWx0YTAgYW5kIGRlbHRhMGMgYmFyIGNoYXJ0CnBfZGVsdGEwIDwtIGdncGxvdChzd2FwcykgKwogIGdlb21fYmFyKGFlcyh4ID0gYmxvY2tOdW1iZXIsIHkgPSBkZWx0YTApLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmVlbiIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9iYXIoYWVzKHggPSBibG9ja051bWJlciwgeSA9IGRlbHRhMGMpLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuNSkgKwogIGxhYnModGl0bGUgPSAiRGVsdGEwIGFuZCBEZWx0YTBjIChBbW91bnQpIiwgeSA9ICJBbW91bnQiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIENyZWF0ZSB0aGUgZGVsdGExIGFuZCBkZWx0YTFjIGJhciBjaGFydApwX2RlbHRhMSA8LSBnZ3Bsb3Qoc3dhcHMpICsKICBnZW9tX2JhcihhZXMoeCA9IGJsb2NrTnVtYmVyLCB5ID0gZGVsdGExKSwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC43KSArCiAgZ2VvbV9iYXIoYWVzKHggPSBibG9ja051bWJlciwgeSA9IGRlbHRhMWMpLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJwdXJwbGUiLCBhbHBoYSA9IDAuNSkgKwogIGxhYnModGl0bGUgPSAiRGVsdGExIGFuZCBEZWx0YTFjIChBbW91bnQpIiwgeSA9ICJBbW91bnQiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIENvbnZlcnQgZ2dwbG90IG9iamVjdHMgdG8gcGxvdGx5IG9iamVjdHMKcF9kZWx0YTBfcGxvdGx5IDwtIGdncGxvdGx5KHBfZGVsdGEwKQpwX2RlbHRhMV9wbG90bHkgPC0gZ2dwbG90bHkocF9kZWx0YTEpCgojIENvbWJpbmUgdGhlIHR3byBiYXIgcGxvdHMgaW50byBvbmUgZmlndXJlIHdpdGggc3BlY2lmaWVkIGhlaWdodHMgYW5kIHNoYXJlZCB4LWF4aXMKY29tYmluZWRfcGxvdCA8LSBzdWJwbG90KAogIHBfZGVsdGEwX3Bsb3RseSwgcF9kZWx0YTFfcGxvdGx5LAogIG5yb3dzID0gMiwKICBzaGFyZVggPSBUUlVFLAogIGhlaWdodHMgPSBjKDAuNSwgMC41KSAgIyBBZGp1c3QgaGVpZ2h0cyBpZiBuZWVkZWQsIGhlcmUgaXQncyBzcGxpdCBlcXVhbGx5CikgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiRGVsdGEwIGFuZCBEZWx0YTEgQ29tcGFyaXNvbiB3aXRoIERlbHRhMGMgYW5kIERlbHRhMWMiLAogICAgeGF4aXMgPSBsaXN0KAogICAgICB0aXRsZSA9ICJCbG9jayBOdW1iZXIiLAogICAgICByYW5nZXNsaWRlciA9IGxpc3QoCiAgICAgICAgdmlzaWJsZSA9IFRSVUUsCiAgICAgICAgdGhpY2tuZXNzID0gMC4wMgogICAgICApCiAgICApLAogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gImRlbHRhMCIpLCAgIyBZLWF4aXMgZm9yIERlbHRhMCBhbmQgRGVsdGEwYwogICAgeWF4aXMyID0gbGlzdCh0aXRsZSA9ICJkZWx0YTEiKSAgIyBZLWF4aXMgZm9yIERlbHRhMSBhbmQgRGVsdGExYwogICkKCiMgU2hvdyB0aGUgY29tYmluZWQgcGxvdApjb21iaW5lZF9wbG90Cn0KYGBgCmBgYHtyfQppZiAobnJvdyhzd2FwcykgPiAwKSB7CnN3YXBzIDwtIHN3YXBzICU+JQogIG11dGF0ZSgKICAgIGFic19kaWZmX2RlbHRhMCA9IGFicyhkZWx0YTAgLSBkZWx0YTBjKSwKICAgIGFic19kaWZmX2RlbHRhMSA9IGFicyhkZWx0YTEgLSBkZWx0YTFjKQogICkKCnBfYWJzX2RpZmZfZGVsdGEwIDwtIGdncGxvdChzd2FwcykgKwogIGdlb21fYmFyKGFlcyh4ID0gYmxvY2tOdW1iZXIsIHkgPSBhYnNfZGlmZl9kZWx0YTApLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmVlbiIsIGFscGhhID0gMC43KSArCiAgbGFicyh0aXRsZSA9ICJhYnMgZGlmZiBkMCIsIHkgPSAiQUQiKSArCiAgdGhlbWVfbWluaW1hbCgpCgpwX2Fic19kaWZmX2RlbHRhMSA8LSBnZ3Bsb3Qoc3dhcHMpICsKICBnZW9tX2JhcihhZXMoeCA9IGJsb2NrTnVtYmVyLCB5ID0gYWJzX2RpZmZfZGVsdGExKSwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC43KSArCiAgbGFicyh0aXRsZSA9ICJhYnMgZGlmZiBkMSIsIHkgPSAiQUQiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIENvbnZlcnQgZ2dwbG90IG9iamVjdHMgdG8gcGxvdGx5IG9iamVjdHMKcF9hYnNfZGlmZl9kZWx0YTBfcGxvdGx5IDwtIGdncGxvdGx5KHBfYWJzX2RpZmZfZGVsdGEwKQpwX2Fic19kaWZmX2RlbHRhMV9wbG90bHkgPC0gZ2dwbG90bHkocF9hYnNfZGlmZl9kZWx0YTEpCgojIENvbWJpbmUgdGhlIHR3byBiYXIgcGxvdHMgaW50byBvbmUgZmlndXJlIHdpdGggc3BlY2lmaWVkIGhlaWdodHMgYW5kIHNoYXJlZCB4LWF4aXMKY29tYmluZWRfcGxvdCA8LSBzdWJwbG90KAogIHBfYWJzX2RpZmZfZGVsdGEwX3Bsb3RseSwgcF9hYnNfZGlmZl9kZWx0YTFfcGxvdGx5LAogIG5yb3dzID0gMiwKICBzaGFyZVggPSBUUlVFLAogIGhlaWdodHMgPSBjKDAuNSwgMC41KQopICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIkFic29sdXRlIERpZmZlcmVuY2VzIGZvciBEZWx0YTAgYW5kIERlbHRhMSB2cyBjb250cm9sIiwKICAgIHhheGlzID0gbGlzdCgKICAgICAgdGl0bGUgPSAiQmxvY2sgTnVtYmVyIiwKICAgICAgcmFuZ2VzbGlkZXIgPSBsaXN0KAogICAgICAgIHZpc2libGUgPSBUUlVFLAogICAgICAgIHRoaWNrbmVzcyA9IDAuMDIKICAgICAgKQogICAgKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJhYnMgZGlmZiBkMCIpLAogICAgeWF4aXMyID0gbGlzdCh0aXRsZSA9ICJhYnMgZGlmZiBkMSIpCiAgKQoKIyBTaG93IHRoZSBjb21iaW5lZCBwbG90CmNvbWJpbmVkX3Bsb3QKfQpgYGAKCmBgYHtyfQpzdGF0ZXNfMSA8LSBzdGF0ZXMKc3RhdGVzXzEkc2hhcmVQcmljZSA8LSBzdGF0ZXNfMSRzaGFyZVByaWNlLyAxZTE4CnN0YXRlc18xJHNoYXJlUHJpY2VDb250cm9sIDwtICBzdGF0ZXNfMSRzaGFyZVByaWNlQ29udHJvbC8oMWUxOCkKCnBfc2hhcmVQcmljZSA8LSBnZ3Bsb3Qoc3RhdGVzXzEpICsKICBnZW9tX2xpbmUoYWVzKHggPSBibG9ja051bWJlciwgeSA9IHNoYXJlUHJpY2UpLCBjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gYmxvY2tOdW1iZXIsIHkgPSBzaGFyZVByaWNlQ29udHJvbCksIGNvbG9yID0gInJlZCIsIHNpemUgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJTaGFyZSBQcmljZSBDaGFydCIsIHkgPSAiU2hhcmUgUHJpY2UiKSArCiAgdGhlbWVfbWluaW1hbCgpCnBfc2hhcmVQcmljZV9wbG90bHkgPC0gZ2dwbG90bHkocF9zaGFyZVByaWNlKQpjb21iaW5lZF9wbG90IDwtIHBfc2hhcmVQcmljZV9wbG90bHkgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiUG9vbCBBTE0iLAogICAgeGF4aXMgPSBsaXN0KAogICAgICB0aXRsZSA9ICJCbG9jayBOdW1iZXIiLCAKICAgICAgcmFuZ2VzbGlkZXIgPSBsaXN0KAogICAgICAgIHZpc2libGUgPSBUUlVFLCAKICAgICAgICB0aGlja25lc3MgPSAwLjAyCiAgICAgICkKICAgICksCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU2hhcmUgUHJpY2UiKQogICkKY29tYmluZWRfcGxvdApgYGAKCmBgYHtyfQpzdGF0ZXNfMSA8LSBzdGF0ZXMKc3RhdGVzXzEkdHZsIDwtICBzdGF0ZXNfMSR0dmwvMWUxOApzdGF0ZXNfMSR0dmxDb250cm9sIDwtICBzdGF0ZXNfMSR0dmxDb250cm9sLygxZTE4KjIpCgpwX3NoYXJlUHJpY2UgPC0gZ2dwbG90KHN0YXRlc18xKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gYmxvY2tOdW1iZXIsIHkgPSB0dmwpLCBjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gYmxvY2tOdW1iZXIsIHkgPSB0dmxDb250cm9sKSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHRpdGxlID0gIlRWTCBDaGFydCIsIHkgPSAiVFZMIikgKwogIHRoZW1lX21pbmltYWwoKQpwX3NoYXJlUHJpY2VfcGxvdGx5IDwtIGdncGxvdGx5KHBfc2hhcmVQcmljZSkKY29tYmluZWRfcGxvdCA8LSBwX3NoYXJlUHJpY2VfcGxvdGx5ICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIlBvb2wgQUxNIiwKICAgIHhheGlzID0gbGlzdCgKICAgICAgdGl0bGUgPSAiQmxvY2sgTnVtYmVyIiwgCiAgICAgIHJhbmdlc2xpZGVyID0gbGlzdCgKICAgICAgICB2aXNpYmxlID0gVFJVRSwgCiAgICAgICAgdGhpY2tuZXNzID0gMC4wMgogICAgICApCiAgICApLAogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlRWTCIpCiAgKQpjb21iaW5lZF9wbG90CmBgYAoKCmBgYHtyfQpkZXBvc2l0c19tIDwtIGRlcG9zaXRzWywgYygidFdFVEgiLCAidFdFVEhjIiwgInRVU0RDYyIsICJibG9ja051bWJlciIsICJBY3RvciIsICJkZWxTaGFyZXMiLCAiZGVsU2hhcmVzQ29udHJvbCIpXSAlPiUgCiAgYXJyYW5nZShibG9ja051bWJlcikgJT4lCiAgbXV0YXRlKGFjdG9yID0gcGFzdGUwKCJBY3RvciIsIGFzLmludGVnZXIoZmFjdG9yKEFjdG9yKSkpKSAlPiUKICBzZWxlY3QoLUFjdG9yKQoKZGVwb3NpdHNfbSR0V0VUSCA9IGFzLm51bWVyaWMoZGVwb3NpdHNfbSR0V0VUSCkgLyAxZTE4CmRlcG9zaXRzX20kdFdFVEhjID0gYXMubnVtZXJpYyhkZXBvc2l0c19tJHRXRVRIYykgLyAxZTE4CmRlcG9zaXRzX20kdFVTRENjID0gYXMubnVtZXJpYyhkZXBvc2l0c19tJHRVU0RDYykgLyAxZTYKCmRlcG9zaXRzX20kZGVsU2hhcmVzID0gYXMubnVtZXJpYyhkZXBvc2l0c19tJGRlbFNoYXJlcykgLyAxZTE4CmRlcG9zaXRzX20kZGVsU2hhcmVzQ29udHJvbCA9IGFzLm51bWVyaWMoZGVwb3NpdHNfbSRkZWxTaGFyZXNDb250cm9sKSAvIDFlMTgKCmRhdGF0YWJsZShkZXBvc2l0c19tLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAwKSwgY2FwdGlvbiA9ICJEZXBvc2l0cyBUYWJsZSIpICU+JQogIGZvcm1hdFJvdW5kKGNvbHVtbnMgPSBjKCJ0V0VUSCIsICJ0V0VUSGMiKSwgZGlnaXRzID0gMikgJT4lIGZvcm1hdFJvdW5kKGNvbHVtbnMgPSBjKCJ0VVNEQ2MiLCAiZGVsU2hhcmVzIiwgImRlbFNoYXJlc0NvbnRyb2wiKSwgZGlnaXRzID0gMCkKCmBgYAoK